package com.zhb.core.utils;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.commons.collections.CollectionUtils;
/**
 * @ClassName: Page 
 * @Description: 通用的分页封装类
 * @author zhb
 * @date 2016年1月19日 下午2:12:49 
 * 
 * @param <T>
 */
@SuppressWarnings("all")
public class Page<T> {
    protected final static int DEFAULT_SHOW_PAGE_NUMBER_COUNT = 9; //默认显示九页
    public static final int DEFAULT_PAGE_SIZE=10; //默认每页显示的记录数
    //
    private int startIndex;
    //每页现实的记录数
    private int pageSize = 10;
    //总的记录数
    private int totalCount;
    //查询返回的结果集
    private Collection<T> results;
    //
    private int[] showPageNumbers;
    //是否遮蔽冗余的get方法
    private boolean shieldRedundantGetMethods=false;
    public Page() {
        this.startIndex = -1;
        this.totalCount = 0;
        this.results = new ArrayList();
    }

    public Page(int startIndex, int pageSize, int totalCount, Collection<T> results) {
        this.startIndex = startIndex;
        this.pageSize = pageSize;
        this.totalCount = totalCount;
        this.results = results;
    }
    /**
     * @Title: getTotalPageCount 
     * @Description:获得总的页数
     * @return int 
     * @author zhb
     * @return
     * 2016年1月20日上午11:42:37
     */
    public int getTotalPageCount() {
        return (totalCount % pageSize == 0) ? totalCount / pageSize : totalCount / pageSize + 1;
    }
    /**
     * 
     * @Title: getNextIndex 
     * @Description:下一页开始
     * @return int 
     * @author zhb
     * @return
     * 2016年1月20日上午11:43:06
     */
    public int getNextIndex() {
        return startIndex + pageSize;
    }
    /**
     * @Title: getPreviousIndex 
     * @Description:上一页开始 
     * @return int 
     * @author zhb
     * @return
     * 2016年1月20日上午11:43:35
     */
    public int getPreviousIndex() {
        int previousIndex = startIndex - pageSize;
        return previousIndex >= 0 ? previousIndex : 0;
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public Collection<T> getResults() {
        return results;
    }

    public List<T> getList() {
    	if(this.shieldRedundantGetMethods){
    		return new ArrayList<T>();
    	}
        return results == null ? null : results instanceof List ? (List<T>) results : new ArrayList<T>(results);
    }

    public Set<T> getSet() {
    	if(this.shieldRedundantGetMethods){
    		return new HashSet<T>();
    	}
        return results == null ? null : results instanceof Set ? (Set<T>) results : new HashSet<T>(results);
    }

    public List<T> getSortList() {
    	if(this.shieldRedundantGetMethods){
    		return new ArrayList<T>();
    	}
        List list = getList();
        if(!CollectionUtils.isEmpty(list)){
        	if(!(list.get(0) instanceof Comparable)){
        		return list;
        	}
        }
        if (list != null) {
            Collections.sort(list);
        }
        return list;
    }

    public void setResults(Collection<T> results) {
        this.results = results;
    }

    public int getStartIndex() {
        return startIndex;
    }

    public void setStartIndex(int startIndex) {
        this.startIndex = startIndex;
    }

    public int getTotalCount() {
        return totalCount;
    }

    public void setTotalCount(int totalCount) {
        this.totalCount = totalCount;
    }
   /**
    * @Title: getPageCount 
    * @Description: 获得总的页数
    * @return int 
    * @author zhb
    * @return
    * 2016年1月20日上午11:44:38
    */
    public int getPageCount() {
        return totalCount > 0 ? (totalCount - 1) / pageSize + 1 : 0;
    }

    public int getPage() {
    	if(this.getTotalCount()==0){
    		return 0;
    	}
        return startIndex >= 0 ? startIndex / pageSize + 1 : 0;
    }
    
    /**
     * 设置屏蔽冗余get方法标志位。
     * <p>
     * 当该标志位为true时，getList(),getSet(),getSortList()方法将返回空列表。
     * 
     * @param shield 屏蔽冗余标识。
     */
    public void setShieldRedundantGetMethods(boolean shield){
    	shieldRedundantGetMethods=shield;
    }
}
